import mysql.connector
from .crypto import CryptoUtils

class DatabaseManager:
    """
    数据库管理类
    处理用户认证相关的数据库操作：
    - 用户表的创建和管理
    - 用户添加
    - 密码验证
    """

    def __init__(self):
        """
        初始化数据库连接
        - 建立到MySQL数据库的连接
        - 创建必要的数据表
        """
        self.connection = mysql.connector.connect(
            host="localhost",  # 注意修改成自己的数据库地址
            user="root",   # 注意修改成自己的用户名
            password="123456",  # 注意修改成自己的密码
            database="ftp_server"  # 注意修改成自己的数据库名
        )
        self.cursor = self.connection.cursor()
        self._create_tables()

    def _create_tables(self):
        """
        创建用户表
        如果用户表不存在，创建包含以下字段的表：
        - id: 自增主键
        - username: 用户名（唯一）
        - password: 加密后的密码
        - created_at: 创建时间
        """
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS users (
                id INT AUTO_INCREMENT PRIMARY KEY,
                username VARCHAR(255) UNIQUE NOT NULL,
                password VARCHAR(255) NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ''')
        self.connection.commit()

    def add_user(self, username, password):
        """
        添加新用户
        Args:
            username (str): 用户名
            password (str): 密码（将被加密存储）
        Returns:
            bool: 是否添加成功
        """
        hashed_password = CryptoUtils.hash_password(password).decode()
        try:
            self.cursor.execute(
                "INSERT INTO users (username, password) VALUES (%s, %s)",
                (username, hashed_password)
            )
            self.connection.commit()
            return True
        except mysql.connector.Error:
            return False

    def verify_user(self, username, password):
        """
        验证用户凭据
        Args:
            username (str): 用户名
            password (str): 待验证的密码
        Returns:
            bool: 验证是否通过
        """
        self.cursor.execute(
            "SELECT password FROM users WHERE username = %s",
            (username,)
        )
        result = self.cursor.fetchone()
        if not result:
            return False
        
        stored_password = result[0]
        provided_password_hash = CryptoUtils.hash_password(password).decode()
        return stored_password == provided_password_hash

    def close(self):
        """
        关闭数据库连接
        """
        self.cursor.close()
        self.connection.close()
